class Parser  {

	/**
	 *
	 * TODO
	 * - refactor this class to something more native for haxe
	 *
	 */



	//test if undefined or null
	
	//test if undefined or null
	public static function isEmptyValue ( value:Dynamic ):Bool {
//			if( value == undefined || value == null ) {
//				return true;
//			}	else {
			return false;
//			}
	} 
	
	// get valid String value from input value
	// if value is not defined, return default value
	// default value is valid String (cannot be undefined or null)
	// in case that isEmptyStringValid is false - take defaultvalue instead of value
	public static function getStringValue ( 
		value:Dynamic, 
		defaultValue:String , 
		isEmptyStringValid:Bool
	):String
	{

		//defaultValue if not defined - set to empty String
		if( Parser.isEmptyValue (defaultValue)) {
			defaultValue = "";
		}
		
		//for undefined / null - return defaultValue
		if( Parser.isEmptyValue (value)) {
			return defaultValue;
		}
		
		if (!isEmptyStringValid && value.length == 0) {
			return defaultValue;
		}

		return Std.string(value);
	}
	
	
	
	
	
	// get valid Float value from input value
	// if value is not defined, return default value
	// default value is valid String (cannot be undefined or null)
	// in case that isEmptyStringValid is false - take defaultvalue instead of value
	public static function getFloatValue ( 
		value:Dynamic, 
		defaultValue:Float , 
		isZeroValueValid:Bool ,
		isNegativeValueValid:Bool 
		):Float{

		//defaultValue if not defined - set to zero
		if( Parser.isEmptyValue (defaultValue)
			|| Math.isNaN(defaultValue)
			) {
			defaultValue = 0;
		}
		
		//for undefined / null - return defaultValue
		if( Parser.isEmptyValue (value) ) {
			return defaultValue;
		}
		
		var numValue:Int = Float(value);
		if ( Math.isNaN (numValue) ){
			return defaultValue;
		}
		
		if (!isZeroValueValid && numValue==0) {
			return defaultValue;
		}

		if (!isNegativeValueValid && numValue<0) {
			return defaultValue;
		}		
		
		return numValue;

	}
	
	
	
	public static function getBoolValue ( 
		value:Dynamic, 
		defaultValue:Bool 
		):Bool{
	
		if( Parser.isEmptyValue (value) ) {
			return defaultValue;
		}		

/*		// NOTE: stupid code done by original author(s)
		var numValue:Int =  Float(value);
		if ( !isNaN (numValue) ){
			//for numeric value then 0 is false, everything else is true
			if (numValue==0)	{
				return false;
			} else {
				return true;
			}
		}
*/
		var numValue:Int = Int(value);		
		if (!Math.isNaN (numValue))
			return numValue != 0;

		//parse string falue 'true' -> true; else false
		var strValue:String = Parser.getStringValue (value,"false", false);
//trace ("0------------------" + strValue);
		strValue = strValue.toLowerCase();
//trace ("1------------------" + strValue);
/*		
		// NOTE: stupid code done by original author(s)
		if (strValue.indexOf('true') !=-1){
			return true;
		} else {
			return false;
		}
*/
		return strValue.indexOf('true') != -1;
	}
	
	
	/**
	 * Run tests with this main
	 */
	public static function main(){
		var notDefinedNum:Float;
		trace ("testing Parser.getStringValue...");
		trace("1) stringOK  '" + Parser.getStringValue("stringOK","myDefault",true) + "'");
		trace("2) ''        '" + Parser.getStringValue("","myDefault",true) + "'");
		trace("3) myDefault '" + Parser.getStringValue("","myDefault",false) + "'");
//			trace("4) ''        '" + Parser.getStringValue(notDefinedNum) + "'");
//			trace("5) 999       '" + Parser.getStringValue(999) + "'");


		trace ("testing Parser.getFloatValue...");
		trace("01) 999       '" + Parser.getFloatValue(999,22222222,true,true) + "'");
		trace("02) 999       '" + Parser.getFloatValue("999",22222222,true,true) + "'");
//			trace("03) 999       '" + Parser.getFloatValue("999") + "'");
//			trace("04) 0         '" + Parser.getFloatValue("abc") + "'");
//			trace("05) -1        '" + Parser.getFloatValue("abc",-1) + "'");
			trace("06) -1        '" + Parser.getFloatValue("abc",-1, false, false) + "'");
			trace("07) -1        '" + Parser.getFloatValue(null,-1, false, false) + "'");
//			trace("08) 22222222  '" + Parser.getFloatValue(0,22222222) + "'");
//			trace("09) 0         '" + Parser.getFloatValue(0,22222222,true) + "'");
//			trace("10) 22222222  '" + Parser.getFloatValue(0,22222222,false) + "'");
		trace("11) 22222222  '" + Parser.getFloatValue(0,22222222,false,false) + "'");
		trace("12) 22222222  '" + Parser.getFloatValue(-0.1,22222222,false,false) + "'");
		trace("13) -0.1      '" + Parser.getFloatValue(-0.1,22222222,false,true) + "'");
		trace("13) 22222222  '" + Parser.getFloatValue("-0.1x",22222222,false,true) + "'");
		
		trace ("testing Parser.getBoolValue...");
		trace("true       '" + Parser.getBoolValue("1",false) + "'");
		trace("true       '" + Parser.getBoolValue("-1",false) + "'");
		trace("false      '" + Parser.getBoolValue("0.000",false) + "'");
		trace("false      '" + Parser.getBoolValue("",false) + "'");
		trace("true       '" + Parser.getBoolValue("",true) + "'");
		trace("false      '" + Parser.getBoolValue("false",false) + "'");
		trace("false      '" + Parser.getBoolValue("xxx",false) + "'");
		trace("true      '" + Parser.getBoolValue("true",true) + "'");
		trace("true      '" + Parser.getBoolValue("TRUE",true) + "'");
		trace("true      '" + Parser.getBoolValue(" TRUE ",true) + "'");
	}
	
}
